package com.rayboo.example.design.pattern.adapter.actual;

import java.util.HashMap;
import java.util.Map;

/**
 * 适配器模式
 *
 * <p>
 * 适配器模式（Adapter）的定义如下：
 * 将一个类的接口转换成客户希望的另外一个接口，使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
 * 适配器模式分为类结构型模式和对象结构型模式两种，前者类之间的耦合度比后者高，且要求程序员了解现有组件库中的相关组件的内部结构，所以应用相对较少些。
 * <p>
 * 该模式的主要优点如下:
 * 客户端通过适配器可以透明地调用目标接口。
 * 复用了现存的类，程序员不需要修改原有代码而重用现有的适配者类。
 * 将目标类和适配者类解耦，解决了目标类和适配者类接口不一致的问题。
 * 在很多业务场景中符合开闭原则。
 * <p>
 * 其缺点是：
 * 适配器编写过程需要结合业务场景全面考虑，可能会增加系统的复杂性。
 * 增加代码阅读难度，降低代码可读性，过多使用适配器会使系统代码变得凌乱。
 * <p>
 * http://c.biancheng.net/view/1361.html
 *
 * @author ray
 */
public class Main {

    public static void main(String[] args) {
         atTheVeryStart();
        // later();
//        test();
    }

    private static void atTheVeryStart() {
        HttpManager manager = new HttpManager();
        Map<String, String> params = new HashMap<>();
        params.put("id", "1024");

        manager.queryUserNameById(params, new OnResponseListener() {
            @Override
            public void onResponse(String response) {
                System.out.println("请求响应: " + response);
                String[] res = response.split(HttpManager.DIVIDER);
                String code = res[0];
                String result = res[1];
                if (HttpManager.CODE_SUCCESS.equals(code)) {
                    System.out.println("请求成功：username = " + result);
                    return;
                }
                System.out.println("请求失败：message = " + result);
            }

            @Override
            public void onError(String code, String message) {
                System.out.println("请求出错: code = " + code + ", message = " + message);
            }
        });
    }

    private static void later() {
        HttpManager manager = new HttpManager();
        Map<String, String> params = new HashMap<>();
        params.put("id", "1024");

        manager.queryUserNameById(params, new OnResultAdapter() {
            @Override
            public void onSuccess(String s) {
                System.out.println("请求成功：username = " + s);
            }

            @Override
            public void onFailed(String code, String message) {
                System.out.println("请求出错: code = " + code + ", message = " + message);
            }
        });

        manager.queryUserNameById(params, new OnResultAdapter() {
            @Override
            public void onSuccess(String s) {
                System.out.println("请求成功：username = " + s);
            }

            @Override
            public void onFailed(String code, String message) {
                // super.onFailed(code, message);
                System.out.println("对 onFailed 做特别处理");
            }
        });
    }

    private static void test() {
        HttpManager manager = new HttpManager();
        OnResponseListener responseListener = new OnResponseListener() {
            @Override
            public void onResponse(String response) {
                System.out.println("onResponse: " + response);
            }

            @Override
            public void onError(String code, String message) {
                System.out.println("onError: code = " + code + ", message = " + message);
            }
        };
        OnResultAdapter resultAdapter = new OnResultAdapter() {
            @Override
            public void onSuccess(String s) {
                System.out.println("onSuccess: " + s);
            }

            @Override
            public void onFailed(String code, String message) {
                System.out.println("onFailed: code = " + code + ", message = " + message);
            }
        };

        System.out.println("-----");
        manager.queryUserNameById(null, responseListener);
        manager.queryUserNameById(null, resultAdapter);

        Map<String, String> params = new HashMap<>();

        params.put("id", "1024");
        System.out.println("-----");
        manager.queryUserNameById(params, responseListener);
        manager.queryUserNameById(params, resultAdapter);

        params.put("id", "1023");
        System.out.println("-----");
        manager.queryUserNameById(params, responseListener);
        manager.queryUserNameById(params, resultAdapter);
    }
}
